Ich finde das Thema auch sehr interessant nur auch noch nicht dazu gekommen mal meinen "Sempf" dazu abzugeben.
Aber einen Tipp hätte ich...
Also, wenn ich es richtig verstanden habe, stellt die Matrix den Raum dar, indem man sich bewegt, richtig?
* Dann ist die Frage, wozu Sinus/Cosinus nutzen, das ist doch viel zu teuer.
* Also es wird ein virtueller Kreis um die eigene Position gezogen, mit einem Radius von 16?
* Jetzt die Frage, der Blickwinkel, von, bis. Ich rate mal ~90°
* Dann die Frage, wie viele Steps, um von 0° auf 90° zu kommen? Vielleicht 15 Steps, dann ruckelt es vielleicht nicht ganz so.(Geraten) Insgesamt also 60 verschiedene Richtungen in die man blicken kann bei 360° (Vollkreis).
Also eine Idee von mir wäre die 60 Positionen (x,y) in einer Tabelle abzulegen.
Wenn man in eine Richtung blickt, ziehe eine imaginäre Linie von Richtung N bis N+15 (90° bei 15 Steps) mit einem Line-Algorithmus. Jeder Punkt auf dieser Linie ist ein Zielpunkt für die Blickberechnung nennen wir ihn Blicklinie. Jetzt braucht man nur einen weiteren Line-Algorithmus um von der eigenen Position (x,y) zu jedem Punkt auf der Blicklinie zu kommen. Die Tiefe ist die Länge auf dieser Linie. Stößt man auf eine Wand ist die Berechnung zu Ende. Man kennt dann die Entfernung.
Legt man in der 60-Positionen Tabelle noch den Winkel mit ab, lässt sich das bestimmt auch nutzen.
Der Zugriff auf die Matrix ist immer x+yn also sollte es auch hier eine Tabelle geben, die yn vorberechnet hat, dann wäre der Zugriff auf die Matrix x+tabelle[y]
Jetzt kann man bestimmt mal kurz durchrechnen, was das denn an Rechenzeit kosten würde sich so durch die Matrix zu hangeln.
Dabei ist mir aber aufgefallen, das ich die erste Linie gar nicht brauche, es reicht völlig aus, sich von N bis N+15 auf der Positionentabelle längst zu hangeln.
Also müssten 16 Linien verfolgt werden von der eigenen Position (x,y) zu N bis N+15. Dabei würden aber sehr viele Punkte mehrfach besucht gerade am Anfang, was man bestimmt noch optimieren könnte. Also verwerfen wir auch diese Idee.
Aber:
Im Endeffekt ist es grob ein Dreieck das auf der Matrix durchsucht werden müsste. Also 16 * 16 / 2 Punkte. Wir müssen von der eigenen Position also 128 Punkte in der Matrix besuchen. Was läge hier näher als diese 60 Dreiecke in Offset-Tabellen abzulegen, die belegen dann ca. 16kb RAM die eigene Position muss dann immer nur als Offset addiert werden zur Position in der Matrix.
Kein Punkt müsste für eine Blickrichtung doppelt besucht werden.
Hier könnte evtl. ein flotter Rechner mal eben diese Offset-Tabellen(Matrix-Access-Tables) berechnen und doppelt besuchte Punkte innerhalb der Matrix herausfiltern oder ggf. vergessene Punkte extra hinzufügen.
Wenn wir also oben links stehen (0,0) und nach unten rechts blicken (15,15) das entspräche 45°, würde die Matrix-Access-Table bei einer Größe von (64x64) = 4096 Bytes, wie folgt besucht werden müssen. 0 könnten wir uns sparen, da stehen wir selbst.
0, 1, 64, 2, 65, 128, 3, 66, 129, 192, ...
Eine Entfernungungstabelle würde wie folgt aussehen:
0, 1, 1, 2,2,2, 3,3,3,3, ...
0 1 2 3 ...
1 2 3 ...
2 3 ...
3 ...
Die weiteren Matrix-Access-Tables sind jeweils um 5° weiter gedreht.
Kannst ja mal drüber nachdenken.
LG
Lars